Django 部署(Apache) 趟过的坑
Django是一个,由Python写成的开放源代码的Web应用框架,在使用apache部署的时候走了好多坑这里记录下。
参考:
前提条件
- 一个服务器,我使用的是阿里云服务器。
- 推荐使用ubuntu镜像,因为软件集成度高(就是简单,傻瓜也会玩)。
- 已经使用Django搭建好web服务,如何搭建看Django教程。
这里只记录部署apache的坑了,其他上面都有详细讲解,就略了。
安装apache2和mod_wsgi
sudo apt-get install apache2
# Python 2
sudo apt-get install libapache2-mod-wsgi
# Python 3
sudo apt-get install libapache2-mod-wsgi-py3
看版本!!!(非常重要)
版本不同在配置上有区别,推荐使用比较新的版本,也就是2.4以上,如果是1,下面的配置是不一样的!!!
apachectl -v
Server version: Apache/2.4.18 (Ubuntu)
Server built: 2018-06-07T19:43:03
先别急着配置,看看能不能正常启动
sudo service apache2 restart
这时候正常情况会启动默认配置,使用浏览器访问你服务器的外网IP,如果正常会显示下图:
/1548558426.jpg)
无法访问请检查阿里云的防火墙设置,看端口是否允许通过,浏览器默认是80,这里顺便加一个8080,供下面测试。
/1548558134.jpg)
Apache2 Ubuntu Default Page 页面可以正常访问代表我们的apache安装成功,下面开始修改配置文件。
设置目录和文件的权限
一般目录权限设置为 755,文件权限设置为 644
假如项目位置在 /home/user/WebService (在WebService 下面有一个 manage.py,WebService 是项目名称)
cd /home/user/
sudo chmod -R 644 WebService
sudo find WebService -type d | xargs chmod 755
Django 的 settings.py 要设置清楚
media 文件夹一般用来存放用户上传文件,static 一般用来放自己网站的js,css,图片等,在settings.py中的相关设置
STATIC_URL 为静态文件的网址 STATIC_ROOT 为静态文件的根目录,
MEDIA_URL 为用户上传文件夹的根目录,MEDIA_URL为对应的访问网址
需要media的 要给media目录单独设置写的权限
ALLOWED_HOSTS是为了限定请求中的host值,以防止黑客构造包来发送请求。只有在列表中的host才能访问。
注意:在这里本人强烈建议不要使用通配符去配置,另外当DEBUG设置为False的时候必须配置这个配置。否则会抛出异常。*
ALLOWED_HOSTS = ['*']
这里先写个*等全部调通了再改。。。
apache的配置文件
cd /etc/apache2/sites-available
sudo vim mysite.conf
在这里我们自己写个配置
<VirtualHost *:8080>
ServerName www.yourdomain.com
ServerAdmin youremail@mail.com
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
Alias /static/ /home/user//WebService/static/
<Directory /home/user/WebService/static>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
WSGIScriptAlias / /home/user/WebService/WebService/wsgi.py
<Directory /home/user/WebService/WebService>
<Files wsgi.py>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Files>
</Directory>
</VirtualHost>
根据自己的情况改改,要注意目录要对,并且也写下面这个配置,apache版本不同配置是不同的!!!
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
因为我们刚配置里写的是8080的端口,所以要把它加到监听列表里
sudo vim /etc/apache2/ports.conf
Listen 80
加一句
Listen 80
Listen 8080
wsgi.py文件修改
修改这个文件的目的就是把apache2和你的网站project联系起来
import os
from os.path import join,dirname,abspath # +
from django.core.wsgi import get_wsgi_application
PROJECT_DIR = dirname(dirname(abspath(__file__))) # +
import sys # +
sys.path.insert(0,PROJECT_DIR) # +
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "WebService.settings")
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
激活新配
这里不用写路径
sudo a2ensite mysite 或 sudo a2ensite mysite.conf
重启apach
sudo service apache2 restart
访问 你的网站,记得加端口号 0.0.0.0:8080
出错看log
cat /var/log/apache2/error.log
虚拟环境部署
通常我们的系统中会有多个python环境,使用virtualenv管理
源代码安装python3.7
上Python官网下载最新版本的source包,解压后进入安装目录,配置makefile,编译,安装。
# ./configure --prefix=/usr/local --enable-shared --with-ssl
# make
# make install
--prefix=/usr/local --enable-shared 的意思是创建共享链接,以便其他软件编译时调用
--with-ssl 的意思是允许ssl,pip安装的时候会用到
安装虚拟环境
Python 虚拟环境用于将软件包安装与系统隔离开来。
创建一个新的虚拟环境,方法是选择 Python 解释器并创建一个 ./venv 目录来存放它:
$ virtualenv --system-site-packages -p python3.7 ./venv
使用特定于 shell 的命令激活该虚拟环境:
$ source ./venv/bin/activate # sh, bash, ksh, or zsh
当 virtualenv 处于有效状态时,shell 提示符带有 (venv) 前缀。
在不影响主机系统设置的情况下,在虚拟环境中安装软件包。首先升级 pip:
$ pip install --upgrade pip
$ pip list # show packages installed within the virtual environment
之后要退出 virtualenv,请使用以下命令:
$ deactivate # don't exit until you're done using TensorFlow
编译mod_wsgi
mod_wsgi是一个apache的模块,用来把python web和apache连接起来,说实话,不咋好用,一定要下载最新版本,老版本会有不少问题
下载地址
解压后进入安装目录,配置makefile,编译,安装。
./configure --with-apxs=/usr/bin/apxs2 --with-python=py3.7env/venv/bin/python3.7
make
make install
apxs2没有的话以防万一就装一下,--with-python指的是我们想要链接的python目标
配置Apache
在上面的配置基础上加两行
WSGIScriptAlias / /home/user/WebService/WebService/wsgi.py # 在这行下加俩
WSGIDaemonProcess yourdomain.com python-path=/home/user/WebService:/home/user/py3.7env/venv/lib/python3.7/site-packages
WSGIProcessGroup yourdomain.com
WSGIDaemonProcess 你的域名 python-path=刚才用virtualenv创建的python包的路径
重启apache
$ service apache2 restart
看log我们的apache成功的链接到python3.7:
Apache/2.4.18 (Ubuntu) mod_wsgi/4.6.5 Python/3.7 configured -- resuming normal operations
如果出错
看错误代码慢慢查,我研究了一天才成功,首先就是编译的时候configure后一定要带对参数,缺少的库也要全手动安装,还有靠一部分运气才能成功。